<html>
    <head>
        <title>创建视图组件</title>
    </head>
    <body>
        <script>
            /*
                        二、创建视图组件


                                    本部分包含创建视图组件的高级别要求。 本文后续部分将详细检查每个步骤并创建视图组件。


                                    1、视图组件类

                                               可通过以下任一方法创建视图组件类：

                                                    ①、派生自 ViewComponent

                                                    ②、使用 [ViewComponent] 属性修饰类，或者从具有 [ViewComponent] 属性的类派生

                                                    ③、创建名称以 ViewComponent 后缀结尾的类ViewComponent

                                                与控制器一样，视图组件必须是 "公共的"、"非嵌套的" 和 "非抽象的"的类。

                                                视图组件名称是删除了 ViewComponent后缀的类名。

                                                也可以使用 [ViewComponent(Name = "组件名称")] 属性来重命名视图组件。

                                                ★、视图组件类：

                                                        ①、支持构造函数依赖项注入

                                                        ②、不参与控制器生命周期!!，因此不能在视图组件中使用筛选器


                                                ★、要阻止将具有 ViewComponent 后缀（不区分大小写）的类视为视图组件，请使用 [NonViewComponent] 特性修饰该类：

                                                        using Microsoft.AspNetCore.Mvc;

                                                        [NonViewComponent]
                                                        public class ReviewComponent
                                                        {
                                                            public string Status(string name) => JobStatus.GetCurrentStatus(name);
                                                        }


                                    2、视图组件方法：

                                                视图组件在以下方法中定义其逻辑：

                                                        ①、返回 Task<IViewComponentResult> 的 InvokeAsync 方法。、
                                                        
                                                        ②、返回 IViewComponentResult 的 Invoke 同步方法。


                                                参数直接来自视图组件的调用，而不是来之模型绑定。

                                                视图组件从来不直接处理请求。通常，视图组件通过调用View方法来初始化模型并将其并将其传递到视图。

                                                总之，视图组件方法：

                                                        ①、定义返回 Task<IViewComponentResult> 的 InvokeAsync 方法，或是返回 IViewComponentResult 的同步 Invoke 方法。

                                                        ②、通常，通过调用 ViewComponent.View 方法来初始化模型并将其传递到视图。

                                                        ③、参数来自调用方法，而不是 HTTP。 没有模型绑定。
                                                        
                                                        ④、不可直接作为 HTTP 终结点进行访问。 它们通常在视图中调用。 视图组件从不处理请求。

                                                        ⑤、在签名上重载，而不是当前 HTTP 请求的任何详细信息。


                                    3、视图搜索路径：


                                                 /Views/{Controller Name}/Components/{View Component Name}/{View Name} (MVC模式下)
                                                 /Views/Shared/Components/{View Component Name}/{View Name} (MVC模式下)
                                                 /Pages/Shared/Components/{View Component Name}/{View Name} (RazorPages模式下)

                                                搜索路径适用于使用控制器 + 视图和 Razor Pages 的项目。

                                                视图组件的默认视图为Default,这意味着视图组件的视图文件名通常为  Default.cshtml.

                                                可以在创建视图组件结果或调用 View 方法时指定不同的视图名称。

                                                建议将视图文件命名为 Default.cshtml 并使用 Views/Shared/Components/{View Component Name}/{View Name} 路径。

                                                此示例中使用的 PriorityList 视图组件对视图组件视图使用 Views/Shared/Components/PriorityList/Default.cshtml。


                                    4、自定义视图搜索路径

                                                修改 Razor 的 ViewLocationFormats (视图位置格式)集合，以自定义视图搜索路径。

                                                 例如，将新项添加到集合，以搜索路径 /Components/{View Component Name}/{View Name} 中的视图：

                                                        using Microsoft.EntityFrameworkCore;
                                                        using ViewComponentSample.Models;

                                                        var builder = WebApplication.CreateBuilder(args);

                                                        builder.Services.AddControllersWithViews()
                                                            .AddRazorOptions(options =>
                                                            {
                                                                options.ViewLocationFormats.Add("/{0}.cshtml");  // 视图位置格式集合
                                                            });

                                                        builder.Services.AddDbContext<ToDoContext>(options =>
                                                                options.UseInMemoryDatabase("db"));

                                                        var app = builder.Build();

                                                     在前面的代码中，占位符 {0} 表示路径 Components/{View Component Name}/{View Name}。

                           */
        </script>
    </body>
</html>